package com.warningrc.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 提供时间操作的工具方法
 * 
 * @author <a href="http://weibo.com/weibowarning">王宁</a><br/>
 * email: <a href="mailto:childe.wangning@gmail.com">childe.wangning@gmail.com</a>
 * @date  2012-3-12
 */
public class DateTools {
	private static final SimpleDateFormat DATA_FORMAT = new SimpleDateFormat(
			"yyyy-MM-dd E HH:mm:ss:SSS");

	/**
	 * 根据给定的模式格式化当前时间
	 * <p>
	 * 若参数为null,返回yyyy-MM-dd E HH:mm:ss:SSS格式的当前时间<br>
	 * 例如：2011-07-12 星期二 22:27:56:797
	 * 
	 * @param format
	 *            格式化时间的模式
	 * @return 格式化后的当前时间
	 */
	public static String getTime(String format) {
		return getTime(new Date(), format);
	}

	/**
	 * 根据给定的模式格式化给定的时间
	 * <p>
	 * 若参数为null,返回yyyy-MM-dd E HH:mm:ss:SSS 格式的时间<br>
	 * 例如：2011-07-12 星期二 22:27:56:797
	 * 
	 * @param date
	 *            给定的时间
	 * @param format
	 *            格式化时间的模式
	 * @return 格式化后的时间
	 */
	public static String getTime(Date date, String format) {
		SimpleDateFormat sdf = Assert.checkStringNotEmpty(format) ? new SimpleDateFormat(
				format)
				: DATA_FORMAT;
		return sdf.format(date);
	}

	/**
	 * 将当前时间向后退N天
	 * 
	 * @param beforDay
	 *            后退天的天数
	 * @return 后退后的时间
	 */
	public static Date getTimeBeforDay(int beforDay) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) - beforDay);
		return c.getTime();
	}

	/**
	 * 将当前时间向前进N天
	 * 
	 * @param afterDay
	 *            前进天的天数
	 * @return 前进后的时间
	 */
	public static Date getTimeAfterDay(int afterDay) {
		return getTimeBeforDay(-afterDay);
	}

	/**
	 * 将给定时间向后退N天
	 * 
	 * @param date
	 *            给定的时间
	 * @param beforDay
	 *            后退天的天数
	 * @return 后退后的时间
	 */
	public static Date getTimeBeforDay(Date date, int beforDay) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) - beforDay);
		return c.getTime();
	}

	/**
	 * 将给定时间向前进N天
	 * 
	 * @param date
	 *            给定的时间
	 * @param afterDay
	 *            前进天的天数
	 * @return 前进后的时间
	 */
	public static Date getTimeAfterDay(Date date, int afterDay) {
		return getTimeBeforDay(date, -afterDay);
	}

}
